home *** CD-ROM | disk | FTP | other *** search
/ NeXT Education Software Sampler 1992 Fall / NeXT Education Software Sampler 1992 Fall.iso / SoundAndMusic / cmix / model.instruments / fm.c next >
C/C++ Source or Header  |  1992-01-27  |  2KB  |  54 lines

  1. #include "../H/ugens.h"
  2. #include "../macros/macros.h"
  3.  
  4. double fm(p,n_args)
  5. float *p;
  6. {
  7.  
  8.         float sicar,simod,*xarray,*sine,val;
  9.         float evals[6],tabs[4],modphs,carphs;
  10.         float *risef,*decayf,index,amp,diff,val2;
  11.         int len1,len2,z,j;
  12.         int output,nsamps,i;
  13.     
  14.     output = 1;
  15.     
  16.         /* in Cmix pfields start with p0, which is the starting time */
  17.         /* p2 is pitch of carrier, p3 is pitch of mod, p4&5 index low&hi,
  18.            p6&7 rise and decay times  p8 is amp, p9 is duration of envelope
  19.        on modulator index */
  20.  
  21.     /* writes on cmix file 1 */
  22.     
  23.         sine = floc(1);    /* function 1 is sine wave */
  24.         xarray = floc(2);  /* function 2 is index guide */
  25.         decayf = risef = floc(3);   /*function 3 is envlp shape */
  26.         len1 = fsize(1);    /* lookup size of f1 */
  27.         len2 = fsize(2);    /* lookup size of f2 */
  28.  
  29.         sicar = cpspch(p[2]) * len1/SR; /* convert cps to si */
  30.         simod = cpspch(p[3]) * len1/SR;
  31.         
  32.     p[4] *= simod;
  33.         diff = (p[5] * simod) - p[4];
  34.         modphs = carphs = 0;
  35.         nsamps = setnote(p[0],p[1],output);
  36.  
  37.         z = SR/200;  /* interrupt 200 times per sec (control rate)*/
  38.         evset(p[1],p[6],p[7],3,evals); /* set overall envelope */
  39.         tableset(p[9],len2,tabs);    /* set index envelope */
  40.         
  41.     for(i=j=0; i<nsamps; i++) {
  42.                 if(!j--) {
  43.                         amp = evp(i,risef,decayf,evals) * p[8];
  44.                         index = diff * tablei(i,xarray,tabs) + p[4];
  45.                         j=z;
  46.                 }
  47.                 val= oscil(index,simod,sine,len1,&modphs); 
  48.                 val2= amp * osciln(1.,sicar+val,sine,len1,&carphs);
  49.         /* osciln allows negative sampling increment */
  50.                 ADDOUT(&val2,output);   /* additive writes */
  51.         }
  52.         endnote(output);
  53. }
  54.